package domein;

/**
 *
 * @author Robin
 */
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Observable;
import javax.swing.DefaultListModel;
import persistentie.PersistentieFactory;

public class WebinarController extends Observable {

    private static WebinarController theInstance;
    private Registratie r = new Registratie();

    public static WebinarController getInstance() {
        if (theInstance == null) {
            theInstance = new WebinarController();
        }
        return theInstance;
    }

    public boolean gebruikersnaamControleren(String gn) {

        for (int key : getR().getGebruikers().keySet()) {
            Gebruiker g = getR().getGebruikers().get(key);
            if ((g.getVoornaam().toLowerCase() + g.getFamilienaam().toLowerCase()).equals(gn.toLowerCase())) {
                return true;
            }
        }
        return false;
    }

    public boolean wachtwoordControleren(String gn, String ww) {
        for (int key : getR().getGebruikers().keySet()) {
            Gebruiker g = getR().getGebruikers().get(key);
            String encrypt = null;

            try {
                encrypt = md5(ww);
            } catch (Exception e) {
                System.out.println(e.toString());
            }

            if ((g.getVoornaam().toLowerCase() + g.getFamilienaam().toLowerCase()).equals(gn.toLowerCase())) {
                if (g.getWachtwoord().equals(encrypt)) {
                    return true;
                }
            }
        }
        return false;
    }
    //wachtwoord decoderen

    private static String md5(String input) throws NoSuchAlgorithmException {
        String result = input;
        if (input != null) {
            MessageDigest md = MessageDigest.getInstance("MD5"); //or "SHA-1"
            md.update(input.getBytes());
            BigInteger hash = new BigInteger(1, md.digest());
            result = hash.toString(16);
            while (result.length() < 32) {
                result = "0" + result;
            }
        }
        return result;
    }

    public void voegGebruikerToe(Gebruiker g) throws Exception {
        if (!gebruikerBestaat(g.getVoornaam() + g.getFamilienaam())) {
            PersistentieFactory.getGebruikerMapper().voegGebruikerToe(g);
            setChanged();
            notifyObservers("nieuweGebruiker");
        } else {
            throw new Exception("Gebruiker " + g.getFamilienaam() + " bestaat");
        }
    }
    //gebruiker wijzigen

    public void wijzigGebruiker(Gebruiker g) {
        PersistentieFactory.getGebruikerMapper().wijzigGebruiker(g);
        setChanged();
        notifyObservers("wijzigGebruiker");
    }

    public void verwijderGebruiker(int gid) {
        PersistentieFactory.getGebruikerMapper().verwijderGebruiker(gid);
        setChanged();
        notifyObservers("nieuweGebruiker");
    }

    public boolean gebruikerBestaat(String gebruikersnaam) {

        for (int key : getR().getGebruikers().keySet()) {
            Gebruiker value = getR().getGebruikers().get(key);
            if ((value.getVoornaam() + value.getFamilienaam()).toLowerCase().equals(gebruikersnaam.toLowerCase())) {
                return true;
            }
        }
        return false;
    }

    public int getGebruikerID(String gn) {
        int gebruikerid = 0;

        for (int key : getR().getGebruikers().keySet()) {
            Gebruiker g = getR().getGebruikers().get(key);
            if ((g.getVoornaam().toLowerCase() + g.getFamilienaam().toLowerCase()).equals(gn.toLowerCase())) {
                gebruikerid = key;
            }
        }
        return gebruikerid;
    }

    public DefaultListModel geefAlleGebruikers(int gid) {
        DefaultListModel geefAllegebruikers = new DefaultListModel();
        ArrayList<String> gebruikers = PersistentieFactory.getGebruikerMapper().geefAlleGebruikers(gid);
        for (String s : gebruikers) {
            geefAllegebruikers.addElement(s);
        }
        return geefAllegebruikers;
    }

    //nieuwe webinar toevoegen
    public void voegWebinarToe(Webinar webinar) {
        PersistentieFactory.getWebinarMapper().voegNieuweWebinarToe(webinar);
        setChanged();
        notifyObservers("nieuweWebinar");
    }

    public DefaultListModel geefIngeschrevenWebinars(int gid) {
        DefaultListModel listIngeschreven = new DefaultListModel();

        for (Webinar w : PersistentieFactory.getWebinarMapper().geefIngeschrevenWebinars(gid)) {
            listIngeschreven.addElement(w);
        }
        return listIngeschreven;
    }

    public DefaultListModel geefActieveWebinars(int gid) {
        DefaultListModel listActief = new DefaultListModel();
        for (Webinar w : PersistentieFactory.getWebinarMapper().geefActieveWebinars(gid)) {
            listActief.addElement(w);
        }
        return listActief;
    }

    public Webinar geefIngeschrevenWebinar(int gid) {
        Webinar webinar = PersistentieFactory.getWebinarMapper().geefWebinar(gid);
        return webinar;
    }

    public DefaultListModel geefGepasseerdeWebinars(int gid) {
        DefaultListModel listGepasseerde = new DefaultListModel();
        for (Webinar w : PersistentieFactory.getWebinarMapper().geefGepasseerdeWebinars(gid)) {
            listGepasseerde.addElement(w);
        }
        return listGepasseerde;
    }

    public DefaultListModel geefGeplandeWebinars(int gid) {
        DefaultListModel listGeplande = new DefaultListModel();
        for (Webinar w : PersistentieFactory.getWebinarMapper().geefGeplandeWebinars(gid)) {
            listGeplande.addElement(w);
        }
        return listGeplande;

    }

    public void voegWebinarVolgerToe(int gebruikerID, int webinarID) {
        PersistentieFactory.getWebinarMapper().voegWebinarVolgerToe(gebruikerID, webinarID);
        setChanged();
        notifyObservers("nieuweInschrijving");
    }

    public void verwijderWebinarVolger(int gebruikerID, int webinarID) {
        PersistentieFactory.getWebinarMapper().verwijderWebinarVolger(gebruikerID, webinarID);
        setChanged();
        notifyObservers("nieuweInschrijving");
    }

    public void wijzigWebinar(Webinar web) {
        PersistentieFactory.getWebinarMapper().wijzigWebinar(web);
        setChanged();
        notifyObservers("wijzigWebinar");
    }

    public void verwijderWebinar(int webid) {
        PersistentieFactory.getWebinarMapper().verwijderWebinar(webid);
        setChanged();
        notifyObservers("verwijderWebinar");
    }

    public DefaultListModel geefBeschikbareWebinars(int gid) {
        DefaultListModel beschikbareWebinars = new DefaultListModel();
        ArrayList<Webinar> webinars = PersistentieFactory.getWebinarMapper().geefBeschikbareWebinars(gid);
        for (Webinar w : webinars) {
            beschikbareWebinars.addElement(w);
        }
        return beschikbareWebinars;
    }

    public void startWebinar(int webid) {
        PersistentieFactory.getWebinarMapper().startWebinar(webid);
        setChanged();
        notifyObservers("start");
    }

    public void stopWebinar(int webid) {
        PersistentieFactory.getWebinarMapper().stopWebinar(webid);
        setChanged();
        notifyObservers("stop");
    }

    //chat methodes
    public ArrayList<String> geefChatWebinar(int webinarID) {

        return PersistentieFactory.getChatMapper().geefChatWebinar(webinarID);
    }

    public void voegChatToe(ChatMessage chat) {
        PersistentieFactory.getChatMapper().voegChatToe(chat);
    }

    //Observer updates
    public void updateGebruikers() {
        setR(new Registratie());
    }

    //getters/setters
    /**
     * @return the r
     */
    public Registratie getR() {
        return r;
    }

    /**
     * @param r the r to set
     */
    public void setR(Registratie r) {
        this.r = r;
    }

    //Q&A methoden
    public void SaveAnswer(int qID, int uID, int WebID, String Tekst) {
        PersistentieFactory.getQ_aMapper().SaveAnswer(qID, uID, WebID, Tekst);
    }

    public void saveQuestion(Vraag v) {
        PersistentieFactory.getQ_aMapper().saveQuestion(v);
    }

    public void updateAnswer(int vID, int webID, String tekst) {
        PersistentieFactory.getQ_aMapper().updateAnswer(vID, webID, tekst);
    }

    public ArrayList<Vraag> GetQuestions(int webID) {
        return PersistentieFactory.getQ_aMapper().getQuestions(webID);
    }

    public Antwoord GetAnswer(int webID, int qID) {
        return PersistentieFactory.getQ_aMapper().GetAnswer(webID, qID);
    }

    public ArrayList getQAList(int webid) {
        ArrayList list = new ArrayList();
        for (Vraag v : GetQuestions(webid)) {
            list.add(v);


            String s = "";
            s += GetAnswer(webid, v.getVraagID()).getTekst();

            if (!(s.equals(""))) {
                Antwoord a = GetAnswer(webid, v.getVraagID());
                list.add(a);
            }
        }
        return list;
    }
}
